package fr.nts.framework.database.jpa.model.security;

import java.util.Date;
import java.util.List;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

import fr.nts.framework.database.jpa.enumeration.NTSDroit;
import fr.nts.framework.database.jpa.enumeration.NTSRole;
import fr.nts.framework.database.jpa.model.AJPAModel;

/**
 * Represente un utilisateur de NTS pour une application donnée.
 * Cet utilisateur sert pour l'authentification.
 * 
 * @author sco
 * @version 1.0.0
 */
@Entity
@Table(name = "security_user")
public class SecurityUser extends AJPAModel<Long>{
    
    private static final long serialVersionUID = 1L;
    
    private static final Logger log = LoggerFactory.getLogger(SecurityUser.class);
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, length = 10, unique = true)
    private Long id;
    
    /**
     * Le nom de l'utilisateur NTS
     */
    @Column(name = "name", nullable = false, length = 255)
    private String nom;
    
    /**
     * Le prénom de l'utilisateur NTS
     */
    @Column(name = "firstname", nullable = false, length = 255)
    private String prenom;
    
    /**
     * Le login de l'utilisateur NTS
     */
    @Column(name = "login", nullable = false, length = 255)
    private String login;
    
    /**
     * Le password de l'utilisateur NTS
     */
    @Column(name = "password", nullable = false, length = 255)
    private String password;
    
    /**
     * La date de création de l'utilisateur NTS
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "date_creation", nullable = true, updatable = false)
    private Date dateCreation;
    
    /**
     * Utilisateur activé ou non
     */
    @Column(name = "activated", nullable = false, length = 1)
    private boolean actif = false;
    
    /**
     * Le rôle de l'utilisateur NTS
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "role", nullable = false)
    private NTSRole role;
    
    /**
     * Les droits de l'utilisateur NTS
     */
    @ElementCollection(fetch = FetchType.EAGER)  
    @CollectionTable(name = "security_user_rights", joinColumns = {@JoinColumn(name = "user_id")})  
    @Column(name = "right")  
    @Enumerated(EnumType.STRING)
    private List<NTSDroit> droits = Lists.newArrayList();  
    
    
    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString(){
    	if(getLog().isDebugEnabled()){
	    	return new ToStringBuilder(this).append("id", id)
	    	                                .append("nom", nom)
	    	                                .append("prenom", prenom)
	    	                                .append("password", password)
	    	                                .append("role", role)
	    	                                .append("actif", actif)
	    	                                .append("Nb droit", droits.size())
	    	                                .append("dateCreation", dateCreation)
	                                        .toString();
    	}else{
    		return super.toString();
    	}
    }


    /*
     * (non-Javadoc)
     * @see fr.nts.framework.database.jpa.model.AJPAObject#getLog()
     */
    @Override
    protected Logger getLog(){
    	return log;
    }


    // GETTER / SETTER
	public Long getId(){
		return id;
	}

	public void setId(Long id){
		this.id = id;
	}

	public String getNom(){
		return nom;
	}

	public void setNom(String nom){
		this.nom = nom;
	}

	public String getPrenom(){
		return prenom;
	}

	public void setPrenom(String prenom){
		this.prenom = prenom;
	}

	public String getLogin(){
		return login;
	}

	public void setLogin(String login){
		this.login = login;
	}

	public String getPassword(){
		return password;
	}

	public void setPassword(String password){
		this.password = password;
	}

	public Date getDateCreation(){
		return dateCreation;
	}

	public void setDateCreation(Date dateCreation){
		this.dateCreation = dateCreation;
	}

	public NTSRole getRole(){
		return role;
	}

	public void setRole(NTSRole role){
		this.role = role;
	}

	public List<NTSDroit> getDroits(){
		return droits;
	}

	public void setDroits(List<NTSDroit> droits){
		this.droits = droits;
	}

	public boolean isActif(){
		return actif;
	}

	public void setActif(boolean actif){
		this.actif = actif;
	}
}